﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;

using System.Diagnostics;

namespace LowLevelGraphics.ImageFormats.SVG.Shapes
{
    /// <summary>
    /// 
    /// </summary>
    public enum FillRule
    {
        /// <summary>
        /// 
        /// </summary>
        NonZero,
        /// <summary>
        /// 
        /// </summary>
        EvenOdd
    }

    /// <summary>
    /// 
    /// </summary>
    [DebuggerDisplay("FillColor: {m_FillColor}, StrokeColor: {m_StrokeColor}")]
    public class Style
    {
        protected Color m_FillColor = Color.Transparent;
        protected float m_nFillOpacity = -1;
        protected FillRule m_FillRule = FillRule.NonZero;

        protected Color m_StrokeColor = Color.Transparent;
        protected Single m_fStrokeWidth = -1;
        protected int m_nStrokeOpacity = -1;
        protected int m_nStrokeDashOffset = -1;

        protected float m_fMiterLimit = -1;
        protected LineJoin m_LineJoin = LineJoin.Round;

        protected LineCap m_LineCap = LineCap.Custom;

        //protected 
        /// <summary>
        /// Initializes a new instance of the <see cref="Style"/> class.
        /// </summary>
        public Style()
        {

        }

        /// <summary>
        /// Gets or sets the stroke dash offset.
        /// </summary>
        /// <value>The stroke dash offset.</value>
        public int StrokeDashOffset
        {
            get { return m_nStrokeDashOffset; }
            set { m_nStrokeDashOffset = value; }
        }

        /// <summary>
        /// Gets or sets the color.
        /// </summary>
        /// <value>The color.</value>
        public Color FillColor
        {
            get { return m_FillColor; }
            set { m_FillColor = value; }
        }

        /// <summary>
        /// Gets or sets the color.
        /// </summary>
        /// <value>The color.</value>
        public Color StrokeColor
        {
            get { return m_StrokeColor; }
            set { m_StrokeColor = value; }
        }

        /// <summary>
        /// Gets or sets the width of the stroke.
        /// </summary>
        /// <value>The width of the stroke.</value>
        public Single StrokeWidth
        {
            get { return m_fStrokeWidth; }
            set { m_fStrokeWidth = value; }
        }

        /// <summary>
        /// Gets or sets the stroke opacity.
        /// </summary>
        /// <value>The stroke opacity.</value>
        public int StrokeOpacity
        {
            get { return m_nStrokeOpacity; }
            set { m_nStrokeOpacity = value; }
        }

        /// <summary>
        /// Gets or sets the stroke dash array.
        /// </summary>
        /// <value>The stroke dash array.</value>
        public object StrokeDashArray
        {
            get { return null; }
            set { }
        }

        /// <summary>
        /// Gets or sets the fill opacity.
        /// </summary>
        /// <value>The fill opacity.</value>
        public float FillOpacity
        {
            get { return m_nFillOpacity; }
            set { m_nFillOpacity = value; }
        }

        /// <summary>
        /// Gets or sets the fill rule.
        /// </summary>
        /// <value>The fill rule.</value>
        public FillRule FillRule
        {
            get { return m_FillRule; }
            set { m_FillRule = value; }
        }

        /// <summary>
        /// Gets or sets the miterlimit.
        /// </summary>
        /// <value>The miterlimit.</value>
        public float Miterlimit
        {
            get { return m_fMiterLimit; }
            set { m_fMiterLimit = value; }
        }

        /// <summary>
        /// Gets or sets the line join.
        /// </summary>
        /// <value>The line join.</value>
        public LineJoin LineJoin
        {
            get { return m_LineJoin; }
            set { m_LineJoin = value; }
        }

        /// <summary>
        /// Gets or sets the line cap.
        /// </summary>
        /// <value>The line cap.</value>
        public LineCap LineCap
        {
            get { return m_LineCap; }
            set { m_LineCap = value; }
        }
    }
}
